package com.teamsun.rptsql.mysql;

import com.teamsun.rptcfg.BaseRpt;
import com.teamsun.rptsql.ICreateSQL;
import com.teamsun.rptsql.IDBFunction;
import com.teamsun.util.Constants;

import java.util.Map;

/**
 * <p>动态生成MYSQL数据库SQL</p>
 */
public class CreateMySqlSQL implements ICreateSQL {

    public IDBFunction mysqlFunction;

    public CreateMySqlSQL(IDBFunction mysqlFunction) {
        this.mysqlFunction = mysqlFunction;
    }

    /**
     * 拼接查询明细数据SQL
     * @param baseRpt  报表配置信息
     * @param params 查询条件
     * @return
     */
    @Override
    public String getRptSql(BaseRpt baseRpt, Map<String, String> params) {
        // 报表查询类型
        String tmplateType = baseRpt.getTmplateType();

        // 最终生成的查询SQL
        String finalSQL = "";

        MysqlConcateSQL mysqlConcateSQL = new MysqlConcateSQL(mysqlFunction);
        if(Constants.TMPLATETYPE_DEFAULT.equals(tmplateType)) {  // 默认查询或CUBE查询
            finalSQL = mysqlConcateSQL.concateSelectSQL(baseRpt, params, mysqlFunction);
        } else {  // 查询非CUBE数据
            finalSQL = mysqlConcateSQL.concateCubeSelectSQL(baseRpt, params, mysqlFunction);
        }

        return finalSQL;
    }

    /**
     * 拼接汇总查询语句
     * @param baseRpt 报表配置信息
     * @param params 传递参数
     * @param rptSql  明细查询SQL
     * @return
     */
    @Override
    public String getSumRptSql(BaseRpt baseRpt,Map<String, String> params,String rptSql) {
        // 报表查询类型
        String tmplateType = baseRpt.getTmplateType();

        // 最终生成的查询SQL
        String finalSQL = "";

        MysqlConcateSQL mysqlConcateSQL = new MysqlConcateSQL(mysqlFunction);
        if(Constants.TMPLATETYPE_DEFAULT.equals(tmplateType)) {  // 默认查询或CUBE查询
            finalSQL = mysqlConcateSQL.concateSumSQL(baseRpt, rptSql);
        } else {
            finalSQL = mysqlConcateSQL.concateCubeSumSQL(baseRpt, params, rptSql);
        }
        return finalSQL;
    }

    /**
     * 拼接分页查询报表明细数据SQL
     * @param baseRpt 报表配置信息
     * @param params 查询条件
     * @param startIndex 起始行
     * @param endIndex 结束行
     * @return
     */
    @Override
    public String getRptSqlByPage(BaseRpt baseRpt, Map<String, String> params, int startIndex, int endIndex) {
        // 报表是否需要汇总
        String needSum = baseRpt.getNeedSum();
        // 报表查询类型
        String tmplateType = baseRpt.getTmplateType();

        // 最终生成的查询SQL
        String finalSQL = "";

        MysqlConcateSQL mysqlConcateSQL = new MysqlConcateSQL(mysqlFunction);
        if(Constants.TMPLATETYPE_DEFAULT.equals(tmplateType)) {  // 默认查询或CUBE查询
            finalSQL = mysqlConcateSQL.concatePageSQL(baseRpt, params, startIndex, endIndex);
        } else {
            // 查询非CUBE数据
            finalSQL = mysqlConcateSQL.concateCubePageSQL(baseRpt, params, startIndex, endIndex);
        }

        return finalSQL;
    }

    /**
     * 拼接分页汇总查询SQL
     * @param baseRpt 报表配置信息
     * @param params 传递参数
     * @param rptSqlByPage 分页查询SQL
     * @return
     */
    @Override
    public String getSumRptSqlByPage(BaseRpt baseRpt,Map<String, String> params,String rptSqlByPage) {
        // 报表查询类型
        String tmplateType = baseRpt.getTmplateType();

        // 最终生成的查询SQL
        String finalSQL = "";

        MysqlConcateSQL mysqlConcateSQL = new MysqlConcateSQL(mysqlFunction);
        if(Constants.TMPLATETYPE_DEFAULT.equals(tmplateType)) {   // 默认查询或CUBE查询
            finalSQL = mysqlConcateSQL.concateSumSQL(baseRpt, rptSqlByPage);
        } else {   // 非汇总查询
            finalSQL = mysqlConcateSQL.concateCubeSumSQL(baseRpt, params, rptSqlByPage);
        }

        return finalSQL;
    }

    /**
     * 拼接查询数据量SQL
     * @param baseRpt  报表配置信息
     * @param params 查询条件
     * @return
     */
    @Override
    public String getRptCountSql(BaseRpt baseRpt, Map<String, String> params) {
        String finalSQL = "";
        // 报表查询类型
        String tmplateType = baseRpt.getTmplateType();

        if(Constants.TMPLATETYPE_DEFAULT.equals(tmplateType)) {
            MysqlConcateSQL mysqlConcateSQL = new MysqlConcateSQL(mysqlFunction);
            String querySQL = mysqlConcateSQL.concateSelectSQL(baseRpt, params, mysqlFunction);
            finalSQL = mysqlConcateSQL.concateCountSQL(querySQL);
        } else {
            MysqlConcateSQL mysqlConcateSQL = new MysqlConcateSQL(mysqlFunction);
            String querySQL = mysqlConcateSQL.concateCubeSelectSQL(baseRpt, params, mysqlFunction);
            finalSQL = mysqlConcateSQL.concateCountSQL(querySQL);
        }
        return finalSQL;
    }
}
